package borrador.grafica;

import java.awt.Point;

import javax.swing.UIManager;

import logica.AtributoIdentificadorFaltanteException;
import logica.AtributoRepetidoException;
import logica.Diagrama;
import logica.EntidadIdentificadoraFaltanteException;
import logica.EntidadRepetidaException;
import logica.IdExternoInexistenteException;
import logica.IdentificadorVacioException;
import logica.Proyecto;
import logica.RelacionException;
import logica.SinNombreException;
import vista.objetos.AtributoGraficable;
import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.DiagramaGraficable;
import vista.objetos.EntidadGraficable;
import vista.objetos.EntidadTipoNoSoportadoException;
import vista.objetos.GraficableException;
import vista.objetos.RelacionGraficable;
import vista.objetos.ProyectoGraficable;
import vista.objetos.RelacionTipoNoSoportadoException;
import vista.paneles.hojaDibujo.OrientacionHoja;
import borrador.AlertaEntidad;
import controlador.ControladorEditor;
import controlador.NoExisteEntidadGraficable;

/* para probar si al cambiar la entidad en un diagrama se cambia en los otros diagramas que tienen una copia
 * de la entidad
 * 
 * los cambios son en:
 * 		- las entidades que se encuentran como referencia externa
 * 		- los atributos de la entidad
 * 		- el tipo de estrategia de la entidad
 * 		- los identificadores de la entidad
 */

public class AlertaGraficableEntidad {

	public ProyectoGraficable proyectoGraficable;

	public AlertaGraficableEntidad() throws RelacionException, SinNombreException, EntidadRepetidaException, IdExternoInexistenteException, EntidadTipoNoSoportadoException, AtributoRepetidoException, NoExisteEntidadGraficable, RelacionTipoNoSoportadoException, AtributoTipoNoSoportadoException, GraficableException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException 
	{
		/*creo el proyecto lógico para la prueba*/
		AlertaEntidad alerta = new AlertaEntidad();
		
		/*obtengo el proyecto logico*/
		Proyecto proyectoLogico = alerta.getProyecto();
		
		/*para poder guardar el proyecto - sobreescribe archivos*/
		proyectoGraficable = TransformadorAGraficable.setInformacionParaGuardar(proyectoLogico);
		
		/*creo un proyecto graficable. Hay que convertir todos los diagramas logicos que tenga
		 * a diagramas graficables y luego crear el proyecto graficable*/
		crearDiagramasGraficables(proyectoLogico);
		
		/*diagramas graficables del proyecto*/
		DiagramaGraficable diagramaPpal  = proyectoGraficable.getDiagramaActual();
		DiagramaGraficable diagramaHijo1 = proyectoGraficable.getDiagramaActual().getDiagramasHijos().get(0);
		DiagramaGraficable diagramaHijo2 = proyectoGraficable.getDiagramaActual().getDiagramasHijos().get(1);

		/*creo las entidades graficables correspondientes al modelo lógico*/
		EntidadGraficable entidadAlerta0 = crearEntidadGraficableAlerta(alerta);
		EntidadGraficable entidadAlerta1 = crearEntidadGraficableAlerta(alerta);
		EntidadGraficable entidadAlerta2 = crearEntidadGraficableAlerta(alerta);
		
		EntidadGraficable entidadPlazo0 = crearEntidadGraficablePlazo(alerta);
		EntidadGraficable entidadPlazo1 = crearEntidadGraficablePlazo(alerta);
		EntidadGraficable entidadPlazo2 = crearEntidadGraficablePlazo(alerta);
				
		EntidadGraficable entidadAuxiliar1 = crearEntidadGraficableAuxiliar1(alerta);
		EntidadGraficable entidadAuxiliar2 = crearEntidadGraficableAuxiliar2(alerta);
		EntidadGraficable entidadAuxiliar3 = crearEntidadGraficableAuxiliar3(alerta);
		
		EntidadGraficable entidadSoyIgual0 = crearEntidadGraficableSoyIgual(alerta);
		EntidadGraficable entidadSoyIgual1 = crearEntidadGraficableSoyIgual(alerta);
		EntidadGraficable entidadSoyIgual2 = crearEntidadGraficableSoyIgual(alerta);
		
		/*agrego las entidades a los diagramas que corresponden*/
		
			/* diagrama ppal*/
		diagramaPpal.agregarGraficable(entidadAlerta0);
		diagramaPpal.agregarGraficable(entidadPlazo0);
		diagramaPpal.agregarGraficable(entidadAuxiliar1);
		diagramaPpal.agregarGraficable(entidadSoyIgual0);

			/* primer diagrama hijo*/
		diagramaHijo1.agregarGraficable(entidadAlerta1);
		diagramaHijo1.agregarGraficable(entidadPlazo1);
		diagramaHijo1.agregarGraficable(entidadAuxiliar2);
		diagramaHijo1.agregarGraficable(entidadSoyIgual1);
		
			/* segundo diagrama hijo*/
		diagramaHijo2.agregarGraficable(entidadAlerta2);
		diagramaHijo2.agregarGraficable(entidadPlazo2);
		diagramaHijo2.agregarGraficable(entidadAuxiliar3);
		diagramaHijo2.agregarGraficable(entidadSoyIgual2);

		/*creo las jerarquias y las copias*/
		RelacionGraficable relacion0 = crearRelacionEsUn(alerta, diagramaPpal);
		RelacionGraficable relacion1 = crearRelacionEsUn(alerta, diagramaHijo1);
		RelacionGraficable relacion2 = crearRelacionEsUn(alerta, diagramaHijo2);
		
		/*agrego las relaciones en los diagramas correspondientes*/
		diagramaPpal.agregarGraficable(relacion0);
		diagramaHijo1.agregarGraficable(relacion1);
		diagramaHijo2.agregarGraficable(relacion2);

		ControladorEditor controlador = ControladorEditor.getInstancia();
		controlador.abrirVentanaEditor(proyectoGraficable);
	}

	private RelacionGraficable crearRelacionEsUn(AlertaEntidad alerta, DiagramaGraficable diagrama) throws RelacionTipoNoSoportadoException, RelacionException, NoExisteEntidadGraficable
	{
		RelacionGraficable relacionTieneUn;
		relacionTieneUn = TransformadorAGraficable.getRelacionGraficable(alerta.getRelacionTieneUn());
		relacionTieneUn.getPunto().setLocation(new Point(200, 150));
		relacionTieneUn.setEntidadesRol(TransformadorAGraficable.getEntidadRolGraficables(alerta.getRelacionTieneUn().getEntidades(), diagrama));
		
		return relacionTieneUn;
	}
	
	private EntidadGraficable crearEntidadGraficableSoyIgual(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException
	{
		EntidadGraficable entidadSoyIgual = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadSoyIgual());
		entidadSoyIgual.getPunto().setLocation(new Point(50, 300));
		
		return entidadSoyIgual;
	}

	private EntidadGraficable crearEntidadGraficableAuxiliar3(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException
	{
		EntidadGraficable entidadAuxiliar3 = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadAuxiliar3());
		entidadAuxiliar3.getPunto().setLocation(new Point(190, 50));
		
		return entidadAuxiliar3;
	}

	private EntidadGraficable crearEntidadGraficableAuxiliar2(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException
	{
		EntidadGraficable entidadAuxiliar2 = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadAuxiliar2());
		entidadAuxiliar2.getPunto().setLocation(new Point(250, 400));
		
		return entidadAuxiliar2;
	}

	private EntidadGraficable crearEntidadGraficableAuxiliar1(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException
	{
		EntidadGraficable entidadAuxiliar1 = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadAuxiliar1());
		entidadAuxiliar1.getPunto().setLocation(new Point(300, 300));
		
		return entidadAuxiliar1;
	}

	private EntidadGraficable crearEntidadGraficablePlazo(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException 
	{
		EntidadGraficable entidadPlazo = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadPlazo());
		entidadPlazo.getPunto().setLocation(new Point(150, 200));
		
		return entidadPlazo;
	}

	private EntidadGraficable crearEntidadGraficableAlerta(AlertaEntidad alerta) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, GraficableException, IdExternoInexistenteException
	{
		EntidadGraficable entidadAlerta = TransformadorAGraficable.getEntidadGraficable(alerta.getEntidadAlerta());
		entidadAlerta.getPunto().setLocation(new Point(200, 100));
		entidadAlerta.setAtributos(TransformadorAGraficable.getAtributoGraficables(alerta.getEntidadAlerta().getAtributos()));
		entidadAlerta.crearIdentificadores();
		
		int i = 0;
		
		for(AtributoGraficable atributo: entidadAlerta.getAtributos())
		{
			atributo.getPunto().setLocation(new Point(250 + i * 30, 50 + i*20));
			i++;
		}
		
		return entidadAlerta;
	}

	private void crearDiagramasGraficables(Proyecto proyectoLogico)
	{
		DiagramaGraficable diagramaGraficablePpal, diagramaGraficableHijo;
		
		diagramaGraficablePpal = new DiagramaGraficable(proyectoLogico.getDiagramaPpal());
		diagramaGraficablePpal.setOrientacion(OrientacionHoja.SENTIDO_HORIZONTAL);

		for(Diagrama diagramaHijo: proyectoLogico.getDiagramaPpal().getDiagramasHijo())
		{
			diagramaGraficableHijo = new DiagramaGraficable(diagramaHijo);
			diagramaGraficableHijo.setOrientacion(OrientacionHoja.SENTIDO_HORIZONTAL);
			diagramaGraficablePpal.agregarDiagramaHijo(diagramaGraficableHijo);
		}
		
		if(proyectoGraficable == null)
			proyectoGraficable = new ProyectoGraficable(proyectoLogico, diagramaGraficablePpal);
		else
		{
			proyectoGraficable.setDiagramaPpal(diagramaGraficablePpal);
			proyectoGraficable.setDiagramaActual(diagramaGraficablePpal);
			proyectoGraficable.setProyecto(proyectoLogico);
		}	
	}
	
	public static void main(String[] args) 
	{
		String l_f;
		l_f = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";

		try {
			UIManager.setLookAndFeel(l_f);
			new AlertaGraficableEntidad();
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
